]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
js: Explicitly dispose all cairo contexts
authorJasper St. Pierre <jstpierre@mecheye.net>
Mon, 7 Jan 2013 20:07:40 +0000 (15:07 -0500)
committerJasper St. Pierre <jstpierre@mecheye.net>
Tue, 8 Jan 2013 18:07:51 +0000 (13:07 -0500)
Due to limitations and bugs in SpiderMonkey's GC, wrapper objects
for cairo contexts and similar may not get cleaned up immediately
after repainting, leading to leaking memory. Explicitly disposing
of such objects after they're not needed can clean up large portions
of memory for cairo surfaces.

https://bugzilla.gnome.org/show_bug.cgi?id=685513

js/gdm/loginDialog.js
js/ui/boxpointer.js
js/ui/dateMenu.js
js/ui/panel.js
js/ui/popupMenu.js
js/ui/separator.js
js/ui/switcherPopup.js

index 17103227d98e21c4509bd5db447f00f45c482650..6bdd9af93ffa3b1794b86ec7e9cd3a9521d3d100 100644 (file)
@@ -532,6 +532,7 @@ const SessionListItem = new Lang.Class({
                           color.alpha / 255);
         cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
         cr.fill();
+        cr.$dispose();
     },
 
     _onClicked: function() {
index cc8d0acbf0dace4ce66804b5d823922875fd561f..233432e5f1a5958d794924276c54ee0bfa4339bc 100644 (file)
@@ -388,6 +388,8 @@ const BoxPointer = new Lang.Class({
             cr.setLineWidth(borderWidth);
             cr.stroke();
         }
+
+        cr.$dispose();
     },
 
     setPosition: function(sourceActor, alignment) {
index a60d85ff72849cbd01145cd2f6b0ededa0e6943a..bf82443653e639efc0b35cf81da7c9f43a0bb245 100644 (file)
@@ -32,6 +32,7 @@ function _onVertSepRepaint (area)
     cr.setDash([1, 3], 1); // Hard-code for now
     cr.setLineWidth(stippleWidth);
     cr.stroke();
+    cr.$dispose();
 };
 
 const DateMenuButton = new Lang.Class({
index 3618c7814e860c32f5613e773edb13eb3ac98977..dada027a3a5d2fee5538394d4e1065b3cbfafcb7 100644 (file)
@@ -865,8 +865,8 @@ const PanelCorner = new Lang.Class({
         let backgroundColor = node.get_color('-panel-corner-background-color');
         let borderColor = node.get_color('-panel-corner-border-color');
 
-        let noOverlap = borderColor.alpha == 0;
-        let offsetY = noOverlap ? borderWidth : 0;
+        let overlap = borderColor.alpha != 0;
+        let offsetY = overlap ? 0 : borderWidth;
 
         let cr = this.actor.get_context();
         cr.setOperator(Cairo.Operator.SOURCE);
@@ -890,17 +890,18 @@ const PanelCorner = new Lang.Class({
         Clutter.cairo_set_source_color(cr, over);
         cr.fill();
 
-        if (noOverlap)
-            return;
+        if (overlap) {
+            let offset = borderWidth;
+            Clutter.cairo_set_source_color(cr, backgroundColor);
 
-        let offset = borderWidth;
-        Clutter.cairo_set_source_color(cr, backgroundColor);
+            cr.save();
+            cr.translate(xOffsetDirection * offset, - offset);
+            cr.appendPath(savedPath);
+            cr.fill();
+            cr.restore();
+        }
 
-        cr.save();
-        cr.translate(xOffsetDirection * offset, - offset);
-        cr.appendPath(savedPath);
-        cr.fill();
-        cr.restore();
+        cr.$dispose();
     },
 
     _styleChanged: function() {
index 6bcc994a9f7ac0c978d246851251d807e4d9dddb..58b7cb8ec2119e9815e97e1cd35e2e83d02b0e44 100644 (file)
@@ -207,6 +207,7 @@ const PopupBaseMenuItem = new Lang.Class({
             color.alpha / 255);
         cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
         cr.fill();
+        cr.$dispose();
     },
 
     // This returns column widths in logical order (i.e. from the dot
@@ -604,6 +605,7 @@ const PopupSliderMenuItem = new Lang.Class({
             color.alpha / 255);
         cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
         cr.fill();
+        cr.$dispose();
     },
 
     _startDragging: function(actor, event) {
index 1f414481cb49bf6f668970c848a4309485b307be..1de1d89c3e9063fcec8efb87c717f200fe358c41 100644 (file)
@@ -30,5 +30,6 @@ const HorizontalSeparator = new Lang.Class({
         cr.setSource(pattern);
         cr.rectangle(margin, gradientOffset, gradientWidth, gradientHeight);
         cr.fill();
+        cr.$dispose();
     }
 });
index b8ba0d2482dcc8bccfdd0c5f58bf806e3384d666..c3a4ce0d92ae20cc22691a9ad96522e542f64340 100644 (file)
@@ -637,5 +637,6 @@ function drawArrow(area, side) {
 
     Clutter.cairo_set_source_color(cr, bodyColor);
     cr.fill();
+    cr.$dispose();
 }